package Tipos;

import java.io.Serializable;
/*
 * Mensaje que se envie entre las panaderias para realizar la venta de panes.
 */
public class Mensaje implements Serializable {   
    private int idCommit;
    private TipoMensaje mensajePanaderia;
    private int cantPanes;
    private UbicacionPanaderia emisor;
    private UbicacionPanaderia participanteCommit;
    private UbicacionPanaderia iniciador;
    

    public Mensaje() {
        this.idCommit = 0;
        this.mensajePanaderia = null;
        this.cantPanes = 0;
        this.emisor = null;
        this.participanteCommit = null;
        this.iniciador = null;
    }
    
    public Mensaje(TipoMensaje MensajePanaderia, int cantPanes, UbicacionPanaderia emisor, UbicacionPanaderia participanteCommit, UbicacionPanaderia iniciador) {
        this.participanteCommit = participanteCommit;
        this.emisor = emisor;
        this.mensajePanaderia = MensajePanaderia;
        this.cantPanes = cantPanes;
        this.iniciador = iniciador;
        this.idCommit = 0;
    }
    
    public Mensaje(String mensaje){
        //obteniendo MensajePanaderia
        int igual = mensaje.indexOf('=') + 2; // para eliminar el espacio despues del igual
        int finValor = mensaje.indexOf(';', igual);
        String subMensaje = mensaje.substring(igual, finValor);
        if(subMensaje.equalsIgnoreCase("DO_COMMIT")){
            this.mensajePanaderia = TipoMensaje.DO_COMMIT;
        }else if(subMensaje.equalsIgnoreCase("GLOBAL_ABORT")){
            this.mensajePanaderia = TipoMensaje.GLOBAL_ABORT;
        }else if(subMensaje.equalsIgnoreCase("GLOBAL_COMMIT")){
            this.mensajePanaderia = TipoMensaje.GLOBAL_COMMIT;
        }else if(subMensaje.equalsIgnoreCase("PANADERIA_CERRADA")){
            this.mensajePanaderia = TipoMensaje.PANADERIA_CERRADA;
        }else if(subMensaje.equalsIgnoreCase("PEDIDO_PANES")){
            this.mensajePanaderia = TipoMensaje.PEDIDO_PANES;
        }else if(subMensaje.equalsIgnoreCase("RESPUESTA_PEDIDO")){
            this.mensajePanaderia = TipoMensaje.RESPUESTA_PEDIDO;
        }else if(subMensaje.equalsIgnoreCase("VOTE_ABORT")){
            this.mensajePanaderia = TipoMensaje.VOTE_ABORT;
        }else if(subMensaje.equalsIgnoreCase("VOTE_COMMIT")){
            this.mensajePanaderia = TipoMensaje.VOTE_COMMIT;
        }else if(subMensaje.equalsIgnoreCase("VOTE_REQUEST")){
            this.mensajePanaderia = TipoMensaje.VOTE_REQUEST;
        }else if(subMensaje.equalsIgnoreCase("null")){
            this.mensajePanaderia = null;
        }
        //System.out.println(subMensaje);
        
        //obteniendo cantPanes
        igual = mensaje.indexOf('=', finValor) + 2; // para eliminar el espacio despues del igual
        finValor = mensaje.indexOf(';', igual);
        subMensaje = mensaje.substring(igual, finValor);
        Integer aux = new Integer(subMensaje);
        this.cantPanes = aux.intValue();
        //System.out.println(subMensaje);
        
        //obteniendo emisor
        igual = mensaje.indexOf('=', finValor) + 2; // para eliminar el espacio despues del igual
        finValor = mensaje.indexOf(';', igual);
        subMensaje = mensaje.substring(igual, finValor);
        if(subMensaje.equalsIgnoreCase("null")){
            this.emisor = null;
        }else{
            this.emisor = new UbicacionPanaderia(subMensaje);
        }
        //System.out.println(subMensaje);
        
        //obteniendo participanteCommit
        igual = mensaje.indexOf('=', finValor) + 2; // para eliminar el espacio despues del igual
        finValor = mensaje.indexOf(';', igual);
        subMensaje = mensaje.substring(igual, finValor);
        if(subMensaje.equalsIgnoreCase("null")){
            this.participanteCommit = null;
        }else{
            this.participanteCommit = new UbicacionPanaderia(subMensaje);
        }
        //System.out.println(subMensaje);
        
        //obteniendo cantPanes
        igual = mensaje.indexOf('=', finValor) + 2; // para eliminar el espacio despues del igual
        finValor = mensaje.indexOf(';', igual);
        subMensaje = mensaje.substring(igual, finValor);
        aux = new Integer(subMensaje);
        this.idCommit = aux.intValue();
        //System.out.println(subMensaje);
        
        //obteniendo iniciador
        igual = mensaje.indexOf('=', finValor) + 2; // para eliminar el espacio despues del igual
        finValor = mensaje.indexOf('}', igual);
        subMensaje = mensaje.substring(igual, finValor + 1);// +1 para que tambien ponga la llave final que pertenece a ubicacionPanaderia
        if(subMensaje.equalsIgnoreCase("null")){
            this.iniciador = null;
        }else{
            this.iniciador = new UbicacionPanaderia(subMensaje);
        }
        //System.out.println(subMensaje);
    }

    public UbicacionPanaderia getParticipanteCommit() {
        return participanteCommit;
    }

    public void setParticipanteCommit(UbicacionPanaderia participanteCommit) {
        this.participanteCommit = participanteCommit;
    }

    public UbicacionPanaderia getEmisor() {
        return emisor;
    }

    public void setEmisor(UbicacionPanaderia emisor) {
        this.emisor = emisor;
    }

    public TipoMensaje getMensajePanaderia() {
        return mensajePanaderia;
    }

    public void setMensajePanaderia(TipoMensaje MensajePanaderia) {
        this.mensajePanaderia = MensajePanaderia;
    }

    public int getCantPanes() {
        return cantPanes;
    }

    public void setCantPanes(int cantPanes) {
        this.cantPanes = cantPanes;
    }

    public UbicacionPanaderia getIniciador() {
        return iniciador;
    }

    public void setIniciador(UbicacionPanaderia iniciador) {
        this.iniciador = iniciador;
    }

    public int getIdCommit() {
        return idCommit;
    }

    public void setIdCommit(int idCommit) {
        this.idCommit = idCommit;
    }
    
    public String mostrarPantalla() {
        String mensaje = "Mensaje: " + mensajePanaderia + " Panes: " + cantPanes + " " ;
        if (emisor != null)
            mensaje = mensaje + "Emisor: " + emisor.getNombre();
        if (participanteCommit != null)
            mensaje =  mensaje + "; PCommit: " + participanteCommit.getNombre();
        if (idCommit != 0 )
            mensaje = mensaje + "; idCommit: " + idCommit;
        if (iniciador != null)
            mensaje =  mensaje + "; Iniciador: " + iniciador.getNombre();
        return mensaje;
    }

    @Override
    public String toString() {
        return "Mensaje { MensajePanaderia = " + mensajePanaderia + "; CantPanes = " + cantPanes + "; Emisor = " + emisor + "; ParticipanteCommit = " + participanteCommit  + "; idCommit = " + idCommit + "; iniciador = " + iniciador + " }";
    }
    
}
